home *** CD-ROM | disk | FTP | other *** search
- /*
- * SFcolours - Star Fighter 3000 colours editor
- * Colours data editing windows
- * Copyright (C) 2001 Chris Bazley
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public Licence as published by
- * the Free Software Foundation; either version 2 of the Licence, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public Licence for more details.
- *
- * You should have received a copy of the GNU General Public Licence
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
- /* ANSI library files */
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
- #include <stdbool.h>
-
- /* RISC OS library files */
- #include "wimp.h"
- #include "toolbox.h"
- #include "event.h"
- #include "wimplib.h"
- #include "window.h"
- #include "gadgets.h"
-
- /* My library files */
- #include "err.h"
- #include "msgtrans.h"
- #include "hourglass.h"
- #include "Macros.h"
- #include "Loader.h"
- #include "ViewsMenu.h"
- #include "SFformats.h"
- #include "Pal256.h"
- #include "NullPoll.h"
- #include "NoBudge.h"
-
- /* Local headers */
- #include "SFCFileInfo.h"
- #include "Utils.h"
- #include "SFCSavebox.h"
- #include "DCS_dialogue.h"
- #include "Menus.h"
- #include "Main.h"
- #include "EditColmap.h"
-
- /* Key shortcuts */
- #define KEY_FILEINFO 0x01 /* File info */
- #define KEY_CLOSEFILE 0x02 /* Close file */
- #define KEY_SAVEFILE 0x04 /* Save file */
- #define KEY_SMOOTHSEL 0x05 /* Smooth transition */
- #define KEY_SELALL 0x06 /* Select all */
- #define KEY_CLEARSEL 0x07 /* Clear selection */
- #define KEY_EDITCOLS 0x08 /* Edit colour */
-
- /* Gadgets */
- #define GADGET_FIRSTCOL 0x44
-
- typedef char number[4];
-
- /* ----------------------------------------------------------------------- */
- /* Function prototypes */
-
- static ToolboxEventHandler _EditColmap_keyhandler, _EditColmap_deleted, _EditColmap_colourpicked;
- static WimpEventHandler _EditColmap_clickhandler, _EditColmap_pointerenter, _EditColmap_pointerleave, _EditColmap_mouseovercheck, _EditColmap_closing;
- static LoaderFinishedHandler _EditColmap_loadfile;
- static _kernel_oserror *_EditColmap_selectcolour(ViewData *data,ObjectId window, ComponentId button);
- static _kernel_oserror *_EditColmap_deselectcolour(ViewData *data, ObjectId window, ComponentId button);
- static void _EditColmap_markaschanged(ViewData *data);
-
- /* ----------------------------------------------------------------------- */
- /* Public functions */
-
- ObjectId EditColmap_create(flex_ptr colours, int hillcols, char *title, bool title_is_file)
- {
- char *template_name;
- ViewData *view_data;
-
- /* Grab memory */
- view_data = malloc(sizeof(ViewData));
- if(view_data == NULL)
- MG_RETV("NoMem", NULL_ObjectId); /* failed */
-
- if(!flex_alloc((flex_ptr)&view_data->sel_table, 64)) {
- MG("NoMem");
- goto err_exit1;
- }
-
- /* Kludge together the two types of colour map, to save having two editors */
- if(hillcols) {
- template_name = "EditHills";
- view_data->num_cols = sizeof(SF_HillCols);
- view_data->start_editnum = 0;
- }
- else {
- template_name = "EditColmap";
- view_data->num_cols = 64;
- view_data->start_editnum = 256; /* first 256 are static */
- }
-
- /* Create object */
- if(E(toolbox_create_object(0, template_name, &view_data->window_id)))
- goto err_exit2;
- if(E(toolbox_set_client_handle(0, view_data->window_id, view_data)))
- goto err_exit3;
-
- /* Add entry to iconbar menu (proper title will be filled in presently) */
- if(E(ViewsMenu_add(view_data->window_id, "", "")))
- goto err_exit3;
-
- view_data->last_savepath = NULL;
- if(!EditColmap_newfile(view_data, title, title_is_file))
- goto err_exit4;
-
- /* Register listener for files on our window */
- if(E(loader_register_listener(0, FILETYPE_FEDNET, view_data->window_id, NULL, load_compressed, _EditColmap_loadfile, view_data)))
- goto err_exit4;
-
- /* Register Wimp event handlers */
- if(E(event_register_wimp_handler(view_data->window_id, Wimp_EMouseClick, _EditColmap_clickhandler, view_data))
- || E(event_register_wimp_handler(view_data->window_id, Wimp_ECloseWindow, _EditColmap_closing, view_data))
- || E(event_register_wimp_handler(view_data->window_id, Wimp_EMouseClick, _EditColmap_clickhandler, view_data)))
- goto err_exit4;
-
- if(view_data->num_cols == 64) {
- /* Extra routines to handle info bar: */
- if(E(event_register_wimp_handler(view_data->window_id, Wimp_EPointerLeavingWindow, _EditColmap_pointerleave, view_data))
- || E(event_register_wimp_handler(view_data->window_id, Wimp_EPointerEnteringWindow, _EditColmap_pointerenter, view_data))
- || E(event_register_wimp_handler(-1, Wimp_ENull, _EditColmap_mouseovercheck, view_data)))
- goto err_exit4;
- }
-
- /* Register Toolbox event handlers - note that the ObjectDeleted handler
- is registered AFTER anything that could cause an error and therefore
- premature deletion! */
- if(!E(event_register_toolbox_handler(view_data->window_id, -1, _EditColmap_keyhandler, view_data))
- && !E(event_register_toolbox_handler(pal256_sharedid, Pal256_ColourSelected, _EditColmap_colourpicked, view_data))
- && !E(event_register_toolbox_handler(view_data->window_id, Toolbox_ObjectDeleted, _EditColmap_deleted, view_data))) {
-
- /* Its now safe to re-anchor colours data from source */
- flex_reanchor((flex_ptr)&view_data->colour_map, colours);
-
- /* Set displayed colours */
- for(int entry = 0; entry < view_data->num_cols; entry++)
- set_24bit_button_col(view_data->window_id, GADGET_FIRSTCOL + entry, palette[view_data->colour_map[view_data->start_editnum + entry]]);
-
- /* Init selection table */
- nobudge_register(256);
- memset(view_data->sel_table, 0, view_data->num_cols);
- nobudge_deregister();
- view_data->mouseover_watcher = false; /* marks that we are not null-polling */
-
- return view_data->window_id; /* success */
- }
-
- /* Rudimentary attempt to recover from error */
- err_exit4:
- RE(ViewsMenu_remove(view_data->window_id));
- err_exit3:
- RE(toolbox_delete_object(0, view_data->window_id));
- err_exit2:
- flex_free((flex_ptr)&view_data->sel_table);
- err_exit1:
- free(view_data);
- return NULL_ObjectId; /* failed */
- }
-
- /* ----------------------------------------------------------------------- */
-
- int EditColmap_get_selcolour(ViewData *view_data)
- {
- /* Return mode 13 colour number of first selected entry */
- for(int entry = 0; entry < view_data->num_cols; entry++) {
- if(view_data->sel_table[entry]) {
- return view_data->colour_map[view_data->start_editnum + entry];
- }
- }
- return -1;
- }
-
- /* ----------------------------------------------------------------------- */
-
- void EditColmap_set_selcolour(ViewData *view_data, char mode13col)
- {
- /* Set mode 13 colour number for all selected entries */
-
- for(int entry = 0; entry < view_data->num_cols; entry++) {
- if(view_data->sel_table[entry]) {
- view_data->colour_map[view_data->start_editnum + entry] = mode13col;
- set_24bit_button_col(view_data->window_id, GADGET_FIRSTCOL + entry, palette[mode13col]);
- }
- }
-
- /* Mark as unsaved changes */
- _EditColmap_markaschanged(view_data);
- }
-
- /* ----------------------------------------------------------------------- */
-
- void EditColmap_selectall(ViewData *view_data)
- {
- hourglass_on();
- for(int gadget_num = GADGET_FIRSTCOL;gadget_num < GADGET_FIRSTCOL+view_data->num_cols;gadget_num++) {
- if(E(_EditColmap_selectcolour(view_data, view_data->window_id, gadget_num))) {
- hourglass_off();
- return;
- }
- }
- hourglass_off();
- }
-
- /* ----------------------------------------------------------------------- */
-
- void EditColmap_clearselection(ViewData *view_data)
- {
- hourglass_on();
- for(int gadget_num = GADGET_FIRSTCOL;gadget_num < GADGET_FIRSTCOL+view_data->num_cols;gadget_num++) {
- if(E(_EditColmap_deselectcolour(view_data, view_data->window_id, gadget_num))) {
- hourglass_off();
- return;
- }
- }
- hourglass_off();
- }
-
- /* ----------------------------------------------------------------------- */
-
- void EditColmap_smoothselection(ViewData *view_data)
- {
- int selected_count, first_selected, last_selected;
- float red_inc, green_inc, blue_inc;
- float red_component, green_component, blue_component;
-
- /* Find colours approximating transition between first and last selected */
- selected_count = 0;
- first_selected = -1;
- for(int entry = 0; entry < view_data->num_cols; entry++) {
- if(view_data->sel_table[entry]) {
- selected_count++;
- if(first_selected == -1)
- first_selected = entry;
- last_selected = entry;
- }
- }
- if(selected_count < 3) {
- _kernel_oswrch(7); /* beep */
- return;
- }
- {
- int red_diff, green_diff, blue_diff;
- int first_paletteentry = palette[view_data->colour_map[view_data->start_editnum+first_selected]];
- int last_paletteentry = palette[view_data->colour_map[view_data->start_editnum+last_selected]];
- red_component = (float)((first_paletteentry & 0x0000ff00) >> 8);
- red_diff = ((last_paletteentry & 0x0000ff00) >> 8) - (int)red_component;
- red_inc = (float)red_diff/(float)(selected_count-1);
-
- green_component = (float)((first_paletteentry & 0x00ff0000) >> 16);
- green_diff = ((last_paletteentry & 0x00ff0000) >> 16) - (int)green_component;
- green_inc = (float)green_diff/(float)(selected_count-1);
-
- blue_component = (float)((first_paletteentry & 0xff000000) >> 24);
- blue_diff = ((last_paletteentry & 0xff000000) >> 24) - (int)blue_component;
- blue_inc = (float)blue_diff/(float)(selected_count-1);
- }
-
- for(int entry = 0; entry < view_data->num_cols; entry++) {
- if(view_data->sel_table[entry] && entry != first_selected && entry != last_selected) {
- /* Calculate transitional colour */
- red_component += red_inc;
- green_component += green_inc;
- blue_component += blue_inc;
-
- /* Find nearest to ideal colour in default mode 13 palette */
- char nearest_colour = real_to_mode13col(((unsigned int)blue_component<<24) | ((unsigned int)green_component<<16) | ((unsigned int)red_component<<8));
- view_data->colour_map[view_data->start_editnum + entry] = nearest_colour;
- set_24bit_button_col(view_data->window_id, GADGET_FIRSTCOL + entry, palette[nearest_colour]);
- }
- }
-
- /* Mark as unsaved changes */
- _EditColmap_markaschanged(view_data);
- }
-
- /* ----------------------------------------------------------------------- */
-
- bool EditColmap_newfile(ViewData *view_data, char *title, bool title_is_file)
- {
- _kernel_osfile_block osfb;
- char *new_ptr, *views_path;
-
- new_ptr = realloc(view_data->last_savepath, strlen(title) + 1);
- if(new_ptr == NULL)
- RG_RETV("NoMem", false) /* failed */
- view_data->last_savepath = new_ptr;
- strcpy(view_data->last_savepath, title); /* not necessarily /strictly/ true but what the hell */
-
- if(title_is_file) {
- /* Get datestamp of file */
- if(_kernel_osfile(17, title, &osfb) == _kernel_ERROR)
- E_RETV(_kernel_last_oserror(), false)
-
- if((osfb.load & 0xfff00000) == 0xfff00000) {
- /* File has datestamp and filetype */
- view_data->file_date[0] = osfb.exec;
- view_data->file_date[1] = osfb.load;
- }
- else {
- /* File has load & exec addresses */
- view_data->file_date[0] = 0;
- view_data->file_date[1] = 0;
- }
- }
- else {
- /* Get current time & date */
- view_data->file_date[0] = 3; /* Read soft-copy of CMOS clock as 5-byte integer */
- if(_kernel_osword(14, view_data->file_date) == _kernel_ERROR)
- E_RETV(_kernel_last_oserror(), false)
- }
-
- E_RETV(window_set_title(0, view_data->window_id, title), false)
- if(title_is_file)
- views_path = title;
- else
- views_path = "";
- E_RETV(ViewsMenu_setname(view_data->window_id, title, views_path), false)
-
- view_data->changed_since_save = false; /* mark as unchanged */
-
- return true; /* success */
- }
-
- /* ----------------------------------------------------------------------- */
-
- void EditColmap_openparentdir(ViewData *view_data)
- {
- /* Open parent directory */
- char *last_dot;
- int nchars;
-
- last_dot = strrchr(view_data->last_savepath, (int)'.');
- if(last_dot == NULL)
- return;
- nchars = (int)(last_dot - view_data->last_savepath);
-
- #ifndef OLD_SCL_STUBS
- char command_buffer[sizeof("Filer_OpenDir ") + nchars + 1];
- #else
- char *command_buffer = malloc(sizeof("Filer_OpenDir ") + nchars + 1);
- if(command_buffer == NULL)
- RG_RET("NoMem")
- #endif
-
- strcpy(command_buffer, "Filer_OpenDir ");
- strncat(command_buffer, view_data->last_savepath, nchars);
- if(_kernel_oscli(command_buffer) == _kernel_ERROR)
- err_check_rep(_kernel_last_oserror());
-
- #ifdef OLD_SCL_STUBS
- free(command_buffer);
- #endif
- }
-
- /* ----------------------------------------------------------------------- */
- /* Private functions */
-
- static int _EditColmap_keyhandler(int event_code, ToolboxEvent *event, IdBlock *id_block, void *handle)
- {
- /* Handle key short-cuts */
- ViewData *view_data = (ViewData *)handle;
-
- switch(event_code) {
- case KEY_FILEINFO:
- RE(open_topleftofwin(Toolbox_ShowObject_AsMenu, fileinfo_sharedid, id_block->self_id, id_block->self_id, NULL_ComponentId));
- return 1; /* claim event */
-
- case KEY_CLOSEFILE:
- if(view_data->changed_since_save) {
- /* Wait for response */
- dcs_openparent = false;
- RE(open_topleftofwin(Toolbox_ShowObject_AsMenu, dcs_sharedid, id_block->self_id, id_block->self_id, NULL_ComponentId))
- }
- else {
- RE(toolbox_delete_object(0, id_block->self_id));
- }
- return 1; /* claim event */
-
- case KEY_SAVEFILE:
- /* Open savebox */
- RE(open_topleftofwin(Toolbox_ShowObject_AsMenu, savebox_sharedid, id_block->self_id, id_block->self_id, NULL_ComponentId))
- return 1; /* claim event */
-
- case KEY_SMOOTHSEL:
- EditColmap_smoothselection(view_data); /* checks internally for insufficient selection */
- return 1; /* claim event */
-
- case KEY_SELALL:
- EditColmap_selectall(view_data);
- //goto update_menu_if_child;
- return 1; /* claim event */
-
- case KEY_CLEARSEL:
- EditColmap_clearselection(view_data);
- //goto update_menu_if_child;
- return 1; /* claim event */
-
- case KEY_EDITCOLS:{
- int sel_colour = EditColmap_get_selcolour(view_data); /* get 1st selected colour */
- if(sel_colour != -1) {
- /* open palette to set selected colours */
- if(!E(Pal256_set_colour(pal256_sharedid, (char)sel_colour)))
- RE(open_topleftofwin(Toolbox_ShowObject_AsMenu, pal256_sharedid, id_block->self_id, id_block->self_id, NULL_ComponentId))
- }
- else
- _kernel_oswrch(7); /* beep */
- }return 1; /* claim event */
- }
- return 0; /* this is heavy, man */
-
- /* Update of open menus is dodgy, so this doesn't really work... */
- //update_menu_if_child:
- // /* Grey/ungrey menu options, if it is open as our child */
- // RE(toolbox_get_ancestor(0, ColsMenu_sharedid, &menu_ancestor, NULL));
- // if(menu_ancestor == id_block->self_id)
- // menus_fade_options(view_data);
- // return 1; /* claim event */
-
- }
-
- /* ======================== Wimp event handlers ========================== */
-
- static int _EditColmap_closing(int event_code, WimpPollBlock *event, IdBlock *id_block, void *handle)
- {
- WimpGetPointerInfoBlock ptr;
- ViewData *view_data = (ViewData *)handle;
- int shift_held;
- bool parent_flag;
-
- /* Check for ADJUST-click on close icon */
- if(!E(wimp_get_pointer_info(&ptr)) && FLAG_SET(ptr.button_state, Wimp_MouseButtonAdjust)) {
-
- /* Is Shift key pressed? */
- shift_held = _kernel_osbyte(129, (0^0xff), 0xff);
- if(shift_held == _kernel_ERROR) {
- err_check_rep(_kernel_last_oserror());
- return 1; /* claim event */
- }
- if((shift_held & 0xff) == 0xff) {
- /* Shift-ADJUST: open parent directory and don't attempt to close window */
- EditColmap_openparentdir(view_data);
- return 1; /* claim event */
- }
- /* ADJUST click with no shift: Open parent and attempt to close window */
- parent_flag = true;
- }
- else
- parent_flag = false; /* no ADJUST click */
-
- /* Attempt to close window */
- if(view_data->changed_since_save) {
- /* Ask them whether to save or discard changes */
- dcs_openparent = parent_flag;
- RE(open_topleftofwin(Toolbox_ShowObject_AsMenu, dcs_sharedid, id_block->self_id, id_block->self_id, NULL_ComponentId))
- }
- else {
- /* No unsaved changes */
- if(parent_flag)
- EditColmap_openparentdir(view_data); /* Open parent directory */
-
- /* The delete handler will do the rest... */
- RE(toolbox_delete_object(0, id_block->self_id));
- }
-
- return 1; /* claim event */
- }
-
- /* ----------------------------------------------------------------------- */
-
- static int _EditColmap_pointerenter(int event_code, WimpPollBlock *event, IdBlock *id_block, void *handle)
- {
- ViewData *view_data = (ViewData *)handle;
-
- nullpoll_register();
- view_data->mouseover_watcher = true;
- view_data->last_mouseover = -1;
-
- return 1; /* claim event */
- }
-
- /* ----------------------------------------------------------------------- */
-
- static int _EditColmap_pointerleave(int event_code, WimpPollBlock *event, IdBlock *id_block, void *handle)
- {
- ViewData *view_data = (ViewData *)handle;
- ObjectId status_bar;
-
- nullpoll_deregister();
- view_data->mouseover_watcher = false;
-
- if(!E(window_get_tool_bars(Window_InternalBottomLeftToolbar, view_data->window_id, &status_bar, NULL, NULL, NULL))) {
- RE(displayfield_set_value(0, status_bar, 0x00, ""));
- }
-
- return 1; /* claim event */
- }
-
- /* ----------------------------------------------------------------------- */
-
- static int _EditColmap_mouseovercheck(int event_code, WimpPollBlock *event, IdBlock *id_block, void *handle)
- {
- ViewData *view_data = (ViewData *)handle;
- int xpos, ypos, buttons;
- ObjectId status_bar, window;
- ComponentId component;
- int hintnum;
- char token[20];
-
- /* Check whether the pointer is over one of the colours */
- E_RETV(window_get_pointer_info(0, &xpos, &ypos, &buttons, &window, &component), 1);
- hintnum = (int)((component-GADGET_FIRSTCOL)/4) + 1;
- if(hintnum > 12 && hintnum < 17)
- hintnum = 12; /* Rest are player's ship livery */
-
- if(window != view_data->window_id || FLAG_SET(buttons, Window_GetPointerNotToolboxWindow) || hintnum == view_data->last_mouseover)
- return 0; /* not window/same gadget */
-
- /* Set the status bar info text */
- E_RETV(window_get_tool_bars(Window_InternalBottomLeftToolbar, view_data->window_id, &status_bar, NULL, NULL, NULL), 1);
-
- if(component < GADGET_FIRSTCOL || component > 0x83) {
- if(!E(displayfield_set_value(0, status_bar, 0x00, "")))
- view_data->last_mouseover = -1;
- }
- else {
- if(hintnum > 12)
- hintnum = 12; /* Rest are player's ship livery */
- sprintf(token, "hint%d", hintnum);
- if(!E(displayfield_set_value(0, status_bar, 0x00, msgs_lookup(token))))
- view_data->last_mouseover = hintnum;
- }
- return 1; /* claim event */
- }
-
- /* ----------------------------------------------------------------------- */
-
- static int _EditColmap_clickhandler(int event_code, WimpPollBlock *event, IdBlock *id_block, void *handle)
- {
- WimpMouseClickEvent *wmce = (WimpMouseClickEvent *)event;
- ViewData *view_data = (ViewData *)handle;
-
- if(wmce->buttons == Wimp_MouseButtonMenu)
- return 0; /* event not handled */
-
- /* give input focus */
- int wimp_handle;
- if(!E(window_get_wimp_handle(0, id_block->self_id, &wimp_handle)))
- RE(wimp_set_caret_position(wimp_handle, -1, 0, 0, -1, -1))
-
- if(id_block->self_component < GADGET_FIRSTCOL || id_block->self_component > 0x83)
- return 0; /* event not handled */
-
- switch(wmce->buttons) {
- case Wimp_MouseButtonSelect: /* SELECT double-click */
- /* Open Pal256 to edit colour entry */
- if(!E(Pal256_set_colour(pal256_sharedid, view_data->colour_map[view_data->start_editnum+(id_block->self_component-GADGET_FIRSTCOL)]))) {
- RE(toolbox_show_object(Toolbox_ShowObject_AsMenu, pal256_sharedid, Toolbox_ShowObject_AtPointer, NULL, id_block->self_id, id_block->self_component));
- }
- return 1; /* claim event */
-
- case Wimp_MouseButtonSelect*256: /* SELECT click */
- /* Select that colour entry and deselect all others */
- hourglass_on();
- for(int gadget_num = GADGET_FIRSTCOL;gadget_num < GADGET_FIRSTCOL + view_data->num_cols;gadget_num++) {
- if(gadget_num == id_block->self_component) {
- if(E(_EditColmap_selectcolour(view_data, id_block->self_id, gadget_num))) {
- hourglass_off();
- return 1; /* claim event */
- }
- }
- else {
- if(E(_EditColmap_deselectcolour(view_data, id_block->self_id, gadget_num))) {
- hourglass_off();
- return 1; /* claim event */
- }
- }
- }
- hourglass_off();
- return 1; /* claim event */
-
- case Wimp_MouseButtonAdjust*256: /* ADJUST click */
- /* Toggle that colour entry */
- if(view_data->sel_table[id_block->self_component-GADGET_FIRSTCOL]) {
- RE(_EditColmap_deselectcolour(view_data, id_block->self_id, id_block->self_component));
- }
- else {
- RE(_EditColmap_selectcolour(view_data, id_block->self_id, id_block->self_component));
- }
- return 1; /* claim event */
- }
- return 0; /* event not handled */
- }
-
- /* ======================== Toolbox event handlers ======================= */
-
- static int _EditColmap_colourpicked(int event_code, ToolboxEvent *event, IdBlock *id_block, void *handle)
- {
- if(id_block->parent_id != ((ViewData *)handle)->window_id)
- return 0; /* none of our business */
-
- EditColmap_set_selcolour((ViewData *)handle, ((Pal256ColourSelectedEvent *)event)->colour_number);
- return 1; /* claim event */
- }
-
- /* ----------------------------------------------------------------------- */
-
- static int _EditColmap_deleted(int event_code, ToolboxEvent *event, IdBlock *id_block, void *handle)
- {
- ViewData *view_data = (ViewData *)handle;
-
- /* Remove handlers */
- RE(event_deregister_toolbox_handler(id_block->self_id, Toolbox_ObjectDeleted, _EditColmap_deleted, view_data))
- RE(event_deregister_toolbox_handler(pal256_sharedid, Pal256_ColourSelected, _EditColmap_colourpicked, view_data))
- RE(event_deregister_toolbox_handler(id_block->self_id, -1, _EditColmap_keyhandler, view_data))
-
- RE(event_deregister_wimp_handler(id_block->self_id, Wimp_EMouseClick, _EditColmap_clickhandler, view_data))
- RE(event_deregister_wimp_handler(id_block->self_id, Wimp_ECloseWindow, _EditColmap_closing, view_data))
-
- if(view_data->num_cols == 64) {
- /* routines to handle info bar */
- RE(event_deregister_wimp_handler(id_block->self_id, Wimp_EPointerLeavingWindow, _EditColmap_pointerleave, view_data))
- RE(event_deregister_wimp_handler(id_block->self_id, Wimp_EPointerEnteringWindow, _EditColmap_pointerenter, view_data))
- if(view_data->mouseover_watcher)
- nullpoll_deregister();
- RE(event_deregister_wimp_handler(-1, Wimp_ENull, _EditColmap_mouseovercheck, view_data))
- }
-
- RE(loader_deregister_listener(FILETYPE_FEDNET, id_block->self_id, NULL))
-
- RE(ViewsMenu_remove(id_block->self_id))
-
- flex_free((flex_ptr)&view_data->colour_map);
- flex_free((flex_ptr)&view_data->sel_table);
- free(view_data->last_savepath);
- free(view_data);
- return 1; /* claim event */
- }
-
- /* ======================= Loader finished handler ======================= */
-
- static void _EditColmap_loadfile(char *title, bool data_saved, flex_ptr buffer, int filetype, void *handle)
- {
- ViewData *view_data = (ViewData *)handle;
-
- if(flex_size(buffer) != sizeof(SF_ColourMap) && flex_size(buffer) != sizeof(SF_HillCols)) {
- M("NoSuchFileType"); /* Code or somet'ing */
- flex_free(buffer);
- return;
- }
-
- if(flex_size(buffer) != view_data->start_editnum + view_data->num_cols) {
- M("WrongZone"); /* Different type of colour map */
- flex_free(buffer);
- return;
- }
-
- /* Overwrite data */
- flex_free((flex_ptr)&view_data->colour_map);
- flex_reanchor((flex_ptr)&view_data->colour_map, buffer);
-
- /* Set displayed colours */
- for(int entry = 0; entry < view_data->num_cols; entry++)
- set_24bit_button_col(view_data->window_id, GADGET_FIRSTCOL+entry, palette[view_data->colour_map[view_data->start_editnum+entry]]);
-
- /* Mark as unsaved changes */
- _EditColmap_markaschanged(view_data);
- }
-
- /* ========================== Utility functions ========================== */
-
- static _kernel_oserror *_EditColmap_selectcolour(ViewData *view_data, ObjectId window, ComponentId button)
- {
- char number[4];
- int colnum = (button-GADGET_FIRSTCOL);
-
- if(view_data->sel_table[colnum])
- return NULL; /* success */
-
- /* Show number and border */
- sprintf(number, "%d", view_data->start_editnum + colnum);
- THROW(button_set_value(0, window, button, number));
- THROW(button_set_flags(0, window, button, WimpIcon_Border, WimpIcon_Border));
-
- view_data->sel_table[colnum] = 1;
-
- return NULL; /* success */
- }
-
- /* ----------------------------------------------------------------------- */
-
- static _kernel_oserror *_EditColmap_deselectcolour(ViewData *view_data, ObjectId window, ComponentId button)
- {
- int colnum = (button-GADGET_FIRSTCOL);
-
- if(!view_data->sel_table[colnum])
- return NULL; /* success */
-
- /* Hide number and border */
- THROW(button_set_value(0, window, button, ""));
- THROW(button_set_flags(0, window, button, WimpIcon_Border, 0));
-
- view_data->sel_table[colnum] = 0;
-
- return NULL; /* success */
- }
-
- /* ----------------------------------------------------------------------- */
-
- static void _EditColmap_markaschanged(ViewData *view_data)
- {
- char wintitle[256];
-
- if(view_data->changed_since_save)
- return;
-
- /* Mark data as changed */
- sprintf(wintitle, "%.253s *", view_data->last_savepath);
- RE(window_set_title(0, view_data->window_id, wintitle));
- RE(ViewsMenu_setname(view_data->window_id, wintitle, NULL));
- view_data->changed_since_save = true;
- }
-